﻿// ## 2023/5/03 # 铃 # 修改了小城市的算法,现在小城市只有市场收入才会继承大城市,自己依然有人丁税收的收入. ##
// ## 2023/1/23 # 铃 # 根据小城市的收入特征,再次优化算法 ##
// ## 2022/12/29 # 铃 # 再次优化人口系统,同时优化资金算法,使得收入更平滑 ##
// ## 2022/11/2 # 铃 # 修改了资金收入算法,以适配新的人口系统 ##
// ## 2022/02/17 # 江东新风 # 人口设定调整 ##
// ## 2021/11/23 # 江东新风 # 港关收入人口影响， ##
// ## 2021/10/01 # 江东新风 # namespace的韩文改成英文 ##
// ## 2021/02/17 # 江东新风 # 城市数惩罚设置上限，调整系数 ##
// ## 2021/02/12 # 氕氘氚 # 解决港关非所属时收入的问题##
// ## 2020/12/12 # 江东新风 # 修复trace参数报错 ##
// ## 2020/10/23 #江东新风#同步马术书大神的更新，添加城市数量惩罚 ##
// ## 2020/09/28 # 氕氘氚 # 添加固定收入 ##
/*
@수정자 : 기마책사
@Update : '18.10.15  / 변경내용 : 관문 병량수입 1.5배 적용
@Update : '19.2.26   / 변경내용 : 게임 내 자체적으로 x0.2배 적용되는 문제로 스크립트에서 x0.2배 적용 제외

*/

namespace GATE_HARVEST
{
	class Main
	{
		Main()
		{
			pk::set_func(153, pk::func153_t(callback));
		}

		int callback(pk::building @building, int city_harvest)
		{
			if (!pk::is_alive(building))
				return 0;
			if (!pk::is_valid_normal_force_id(building.get_force_id()))
				return 0;
			int n = 0;
			int base_id = building.get_id();

			auto base_t = ch::get_base_p(base_id);
			int city_id = pk::get_city_id(building.pos);
			pk::city @city0 = pk::get_city(city_id);
			bool 丰收状态 = city0.housaku;

			n += inter::get_population_harvest(base_id);

			// 全局修正
			n = inter::incomes_global_impact(n, building, 1);

			// 因为城市收入已经被难度修正过一次了,因此放在难度修正系数之后.
			pk::city @city = pk::get_city(pk::get_city_id(building.pos));

			if (city.get_force_id() == building.get_force_id())
			{
				if (ch::is_gate(building.get_id()))
					n += int(city_harvest * 0.05);
				else
					n += int(city_harvest * 0.1);
			}

			else
			{
				if (ch::is_gate(building.get_id()))
					n += int(city_harvest * 0);
				else
					n += int(city_harvest * 0.01);
			}

			n += ch::get_base_p(building.get_id()).harvest_bonus;

			int buff = 0;
			if (city_tech::is_building_force_has_city(building, 39))
				buff += 5;

			n = int(n * (100 + buff) / 100);

			int base_harvest = n;

			// 丰收状态和特技不叠加
			if (丰收状态)
			{
				n = n * 2;
			}
			else
			{
				// 下方函数用于获取城市收支，以便计算内政自动化各类花费---可以考虑是否有更好的写法
				pk::bool_bool skill_check = ch::has_skill(building, 特技_米道, 特技_征收);
				bool 米道特技 = skill_check.first;
				bool 征收特技 = skill_check.second;

				if (米道特技 and !征收特技)
					base_harvest = int(base_harvest * 1.5);

				if (!米道特技 and 征收特技)
					base_harvest = int(base_harvest * 0.5 * 3);

				if (米道特技 and 征收特技)
					base_harvest = int(base_harvest * 0.5) + int(base_harvest * 0.5) + int(base_harvest * 0.5 * 1.5);

				base_t.base_harvest = uint32(base_harvest);
			}
			return n;
		}
	}

	Main main;
}